// 使用但文件组件，实现评论列表
import React from 'react';

// 自定义组件
import { CommentCount } from './CommentCount';
import _ from 'lodash';

import './App.css'; // 导入样式
import avatar from './images/avatar.png'; // 导入图片

class App extends React.Component {
  // constructor 定义
  // 组件的状态
  state = {
    // hot: 热度排序  time: 时间排序
    tabs: [
      {
        id: 1,
        name: '热度',
        type: 'hot',
      },
      {
        id: 2,
        name: '时间',
        type: 'time',
      },
    ],
    active: 'hot',
    list: [
      {
        id: 4,
        author: '五月天4',
        comment: '不打扰，是我的温柔4',
        time: new Date('2021-10-11 11:09:00'),
        // 1: 点赞 0：无态度 -1:踩
        attitude: -1,
      },
      {
        id: 1,
        author: '刘德华',
        comment: '给我一杯忘情水',
        time: new Date('2021-10-10 09:09:00'),
        // 1: 点赞 0：无态度 -1:踩
        attitude: 1,
      },
      {
        id: 2,
        author: '周杰伦',
        comment: '哎哟，不错哦',
        time: new Date('2021-10-11 10:09:00'),
        // 1: 点赞 0：无态度 -1:踩
        attitude: 0,
      },
      {
        id: 3,
        author: '五月天',
        comment: '不打扰，是我的温柔',
        time: new Date('2021-11-11 11:09:00'),
        // 1: 点赞 0：无态度 -1:踩
        attitude: -1,
      },
    ],
    // 评论框输入
    txt: 'xxx',
  };

  // 表单ref
  txtRef = React.createRef();

  // 评论输入变化
  handleTxtChange = (e) => {
    this.setState({
      txt: e.target.value,
    });
  };

  // 发表评论
  handleAddComment = () => {
    console.log(this.state.txt);
    // 组装一个评论
    const comment = {
      id: Math.random(),
      author: '徐帅',
      comment: this.state.txt,
      time: new Date(),
      attitude: 0,
    };
    // 将评论放到 list 中去
    // this.state.list.unshift(comment);
    this.setState({
      list: [comment, ...this.state.list],
      txt: '',
    });

    // 把焦点设置到评论输入框
    this.txtRef.current.focus();
  };

  // 删除评论按钮
  delComment = (e, id) => {
    console.log(id);
    // 操作数组，根据id，删除对应元素。
    // filter 过滤数组
    const newList = this.state.list.filter((item) => item.id !== id);
    this.setState({
      list: newList,
    });
  };

  // 点赞或踩
  changeAttitude = (id, attitude) => {
    console.log(id, attitude);
    // 修改元素组，不增加也不减少
    const newList = this.state.list.map((item) => {
      // 找到你点赞或踩的那一条评论
      if (item.id === id) {
        // item.attitude = attitude;
        // return item;
        // return {
        //   ...item,
        //   // attitude: attitude
        //   attitude,
        // };
      }
      return item;
    });
    // 触发页面更新
    this.setState({
      list: newList,
    });
  };

  // 评论排序
  changeSortType = (type) => {
    console.log(type);
    // 排序数组
    if (type === 'hot') {
      const newList2 = _.sortBy(this.state.list, ['id']);
      console.log(newList2);
      // 按时间戳，倒序，越大（最新的评论）在前面
      const newList = this.state.list.sort((item1, item2) => {
        // 按时间倒序
        return item2.time.getTime() - item1.time.getTime();
      });

      // 刷新页面
      this.setState({
        list: newList2,
        active: type,
      });
    } else {
      // 按时间戳，升序，越小（越旧的评论）在前面
      const newList = this.state.list.sort((item1, item2) => {
        // 按时间倒序
        return item1.time.getTime() - item2.time.getTime();
      });

      // 刷新页面
      this.setState({
        list: newList,
        active: type,
      });
    }
  };

  // 组件UI
  render() {
    // return 后边必须是一个 React 元素、其实就是虚拟DOM对象
    return (
      <div className="comment-root">
        <div className="comment-container">
          {/* 评论数 */}
          <CommentCount />

          {/* 排序tab */}
          <div className="tabs-order">
            {this.state.tabs.map((item) => (
              <div
                className={this.state.active === item.type ? 'on' : ''}
                key={item.id}
                onClick={() => this.changeSortType(item.type)}
              >
                按{item.name}排序
              </div>
            ))}
          </div>

          {/* 发表评论区 */}
          <div className="comment-send-container">
            <div>
              <img className="user-head" src={avatar} alt="头像" />
            </div>
            <div className="comment-send">
              <div className="textarea-container">
                <textarea
                  ref={this.txtRef}
                  cols="80"
                  rows="5"
                  placeholder="发条友善的评论"
                  value={this.state.txt}
                  onChange={this.handleTxtChange}
                  className="ipt-txt"
                />
                <button
                  className="comment-submit"
                  onClick={this.handleAddComment}
                >
                  发表评论
                </button>
              </div>
              <div className="comment-emoji">
                <i className="face"></i>
                <span className="text">表情</span>
              </div>
            </div>
          </div>

          {/* 评论列表区 */}
          <div className="comment-list">
            {this.state.list.map((item) => (
              <div className="comment-item" key={item.id}>
                <div>
                  <img className="user-head" src={avatar} alt="头像" />
                </div>

                <div className="comment">
                  <div className="user">{item.author}</div>
                  <p className="text">{item.comment}</p>
                  <div className="info">
                    <span className="time">{item.time.toLocaleString()}</span>
                    <span
                      className={item.attitude === 1 ? 'like liked' : 'like'}
                      onClick={() =>
                        this.changeAttitude(
                          item.id,
                          item.attitude === 1 ? 0 : 1
                        )
                      }
                    >
                      <i className="icon" />
                    </span>
                    <span
                      className={item.attitude === -1 ? 'hate hated' : 'hate'}
                      onClick={() =>
                        this.changeAttitude(
                          item.id,
                          item.attitude === -1 ? 0 : -1
                        )
                      }
                    >
                      <i className="icon" />
                    </span>
                    <span
                      className="btn-hover"
                      onClick={(e) => this.delComment(e, item.id)}
                    >
                      删除
                    </span>
                  </div>
                </div>
              </div>
            ))}
          </div>
        </div>
      </div>
    );
  }
}

export default App;
